import { defineConfig, devices } from '@playwright/test'
import dotenv from 'dotenv'

// TEST_MODE 的值决定了加载哪个环境的文件
const modeExt = process.env.TEST_MODE || 'development'

// 先加载入仓的配置文件，再加载本地的配置文件
dotenv.config({ path: '.env' })
dotenv.config({ path: `.env.${modeExt}`, override: true })
dotenv.config({ path: '.env.local', override: true })
dotenv.config({ path: `.env.${modeExt}.local`, override: true })

export default defineConfig({
  // 测试目录
  testDir: './tests',
  // 指定测试产物(追踪信息、视频、截图)输出路径
  outputDir: 'test-results',
  // 是否并发运行测试
  fullyParallel: true,
  /* Fail the build on CI if you accidentally left test.only in the source code. */
  forbidOnly: !!process.env.CI,
  // 测试失败用例重试次数
  retries: process.env.CI ? 2 : 0,
  // 测试时使用的进程数，进程数越多可以同时执行的测试任务就越多。不设置则尽可能多地开启进程。
  workers: process.env.CI ? 1 : undefined,
  // 指定测试结果如何输出
  reporter: [
    // 在命令行中同步打印每条用例的执行结果
    ['list'],
    // 输出 html 格式的报告，并将报告归档与指定路径
    [
      'html',
      {
        outputFolder: 'playwright-report'
      }
    ]
  ],
  // 测试 project 的公共配置，会与与下面 projects 字段中的每个对象的 use 对象合并。
  use: {
    // 非 CI 环境下，第一次失败重试时生成追踪信息。非 CI 环境下，总是生成追踪信息
    baseURL: process.env.WEBSITE_URL,
    // 非 CI 环境下，第一次失败重试时生成追踪信息。非 CI 环境下，总是生成追踪信息
    trace: process.env.CI ? 'on-first-retry' : 'on',
    // 非 CI 环境下，第一次失败重试时生成视频。非 CI 环境下，总是生成视频
    video: process.env.CI ? 'on-first-retry' : 'on'
  },
  // 定义每个 project，示例中将不同的浏览器测试区分成了不同的项目
  projects: [
    {
      name: 'chromium',
      use: { ...devices['Desktop Chrome'] }
    },

    {
      name: 'firefox',
      use: { ...devices['Desktop Firefox'] }
    },

    {
      name: 'webkit',
      use: { ...devices['Desktop Safari'] }
    }
  ]
})
